"""
自定义django存储后端，修改ImageField类型字段url属性输出的结果
"""

from rest_framework import serializers
from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client

class FastDFSStorage(Storage):

    def open(self, name, mode='rb'):
        # 我们这里返回None，表示无需打开本地文件因为我们不把文件存储本地
        return None

    def save(self, name, content, max_length=None):
        """
        功能：自定义ImageField类型字段文件保存
        :param name: 文件的名称
        :param content: 文件对象
        :param max_length: 为None不设置长度
        :return: 返回上传fdfs之后的文件标识——该标识就是最终存储在mysql的数据
        """
        # 1、实例化fdfs链接对象
        conn = Fdfs_client('./meiduo_mall/utils/fastdfs/client.conf')
        # 2、调用方法上传
        file_data = content.read()
        res = conn.upload_by_buffer(file_data)
        if res is None:
            # 上传失败
            raise serializers.ValidationError('上传fdfs失败！')
        file_id = res['Remote file_id']

        return file_id


    def url(self, name):
        # 该函数返回到结果就是，ImageField.url属性的出的结果
        # 参数：name就是该文件类型字段在mysql中存储的，如：group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429

        return settings.FDFS_URL + name